package org.spring.aop.support;

import com.sun.istack.internal.Nullable;
import org.tool.core.lang.Assert;

/**
 * 表达式切入点的抽象超类，提供位置和表达式属性。
 *
 * @author 李坤
 * @date 2022/4/19 17:38
 */
public abstract class AbstractExpressionPointcut implements ExpressionPointcut {

    private String location;

    private String expression;

    /**
     * 如果可用，返回有关切入点表达式的位置信息。这在调试中很有用。
     *
     * @return 位置信息作为人类可读的字符串，如果没有可用则为 {@code null}
     */
    public String getLocation() {
        return this.location;
    }

    /**
     * 设置调试位置。
     */
    public void setLocation(String location) {
        this.location = location;
    }

    @Override
    public String getExpression() {
        return this.expression;
    }

    public void setExpression(String expression) {
        this.expression = expression;
        try {
            this.onSetExpression(expression);
        } catch (IllegalArgumentException exception) {
            // 如果可能，请填写位置信息。
            Assert.notNull(this.location, "Location must be specified when setting expression");
        }
    }

    /**
     * 在设置新的切入点表达式时调用。如果可能，此时应解析表达式。
     *
     * <p>
     * 这个实现是空的。
     *
     * @param expression 要设置的表达式
     *
     * @throws IllegalArgumentException 如果表达式无效
     * @see #setExpression
     */
    protected void onSetExpression(@Nullable String expression) throws IllegalArgumentException {
    }

}
